<?php
/**
 * Created by PhpStorm.
 * User: xh
 * Date: 2019/11/22
 * Time: 4:05 PM
 */

namespace weChat;


class Applied extends Pit
{
    /** 获取小程序或公众号全局唯一后台接口调用凭据
     * @return bool|mixed
     */
    public static function GlobalAccessToken(){
        //属性	        类型	        默认值	    必填	        说明
        //grant_type	string		            是	    填写 client_credential
        //appid	        string		            是	    小程序唯一凭证，即 AppID，可在「微信公众平台 - 设置 - 开发设置」页中获得。（需要已经成为开发者，且帐号没有异常状态）
        //secret	    string		            是	    小程序唯一凭证密钥，即 AppSecret，获取方式同 appid
        $query = array(
            'grant_type' => 'client_credential',
            'appid'      => self::$AppId,
            'secret'     => self::$AppSecret,
        );
        $url = 'https://api.weixin.qq.com/cgi-bin/token?'.http_build_query($query);
        //{"access_token":"ACCESS_TOKEN","expires_in":7200}
        return self::Curl($url);
    }

    /** 生成小程序参数二维码 永久 多业务类型 不受数量限制
     * 1.pit-weChat-Serve-codeUnLimit
     * @param string $GlobalAccessToken 全局token
     * @param string $scene 码的参数值
     * @param string $page  页面地址
     * @return bool|mixed
     */
    public static function CodeUnLimit($GlobalAccessToken='',$scene='',$page='pages/index/index'){
        //属性	            类型	        默认值	必填	        说明
        //access_token	    string		        是	    接口调用凭证
        //scene	            string		        是	    最大32个可见字符，只支持数字，大小写英文以及部分特殊字符：!#$&'()*+,/:;=?@-._~，其它字符请自行编码为合法字符（因不支持%，中文无法使用 urlencode 处理，请使用其他编码方式）
        //page	            string	    主页	    否	    必须是已经发布的小程序存在的页面（否则报错），例如 pages/index/index, 根路径前不要填加 /,不能携带参数（参数请放在scene字段里），如果不填写这个字段，默认跳主页面
        //width	            number	    430	    否	    二维码的宽度，单位 px，最小 280px，最大 1280px
        //auto_color	    boolean	    false	否	    自动配置线条颜色，如果颜色依然是黑色，则说明不建议配置主色调，默认 false
        //line_color	    Object	{"r":0,"g":0,"b":0}	否	auto_color 为 false 时生效，使用 rgb 设置颜色 例如 {"r":"xxx","g":"xxx","b":"xxx"} 十进制表示
        //is_hyaline	    boolean	    false	否	    是否需要透明底色，为 true 时，生成透明底色的小程序
        $query = array(
            'scene'        => $scene,
            'page'         => $page,
        );
        $url = 'https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token='.$GlobalAccessToken;
        //返回的图片 Buffer
        return self::Curl($url,JsonEn($query));
    }

    /** 会话密钥session_key
     * @param $jsCode
     * @return bool|mixed
     */
    public static function SessionKey($jsCode){
        //属性	        类型	    必填	    说明
        //appid	       string	 是	  小程序 appId
        //secret	   string    是	  小程序 appSecret
        //js_code	   string	 是	  登录时获取的 code
        //grant_type   string	 是	  授权类型，此处只需填写 authorization_code
        $query = array(
            'grant_type' => 'authorization_code',
            'appid'      => self::$AppId,
            'secret'     => self::$AppSecret,
            'js_code'     => $jsCode,
        );
        $url = 'https://api.weixin.qq.com/sns/jscode2session?'.http_build_query($query);
        //{"session_key":"Ee9EMmQG7vjDM2tQAZoTsw==","openid":"oWuQv5fUpCFtXkgJuziy_EOh9Vvk"} 成功返回
        //{"errcode":40163,"errmsg":"code been used, hints: [ req_id: XGedu7aLRa-sEuAha ]"} 失败返回
        //false 请求出错返回
        return self::Curl($url);
    }

    /** 微信数据-解密
     * @param $SessionKey
     * @param $Iv
     * @param $EncryptedData
     * @param $weChatUserInfo
     * @return int
     */
    public static function UserInfo($SessionKey,$Iv,$EncryptedData,&$weChatUserInfo){
        if (strlen($SessionKey) != 24) {
            return -41001;//IllegalAesKey
        }
        $aesKey=base64_decode($SessionKey);
        if (strlen($Iv) != 24) {
            return -41002;//IllegalIv
        }
        $aesIV=base64_decode($Iv);
        $aesCipher=base64_decode($EncryptedData);
        $result= openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
        $dataObj = json_decode( $result );
        if($dataObj  == NULL){
            return -41003;//IllegalBuffer
        }
        if($dataObj->watermark->appid != self::$AppId){
            return -41003;//IllegalBuffer
        }
        $weChatUserInfo = $result;
        //解密之后数据
        //{"openId":"oWuQv5fUpCFtXkgJuziy_EOh9Vvk","nickName":"老年人-夕欢","gender":1,"language":"zh_CN","city":"","province":"","country":"Holy See (the) [Vatican City State]","avatarUrl":"https://wx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTIZnVibppn1QNicARccujDb7fBn743nQeomG70xwK7onB5vXumCfXPksWFNDs5go5QgHJPsiagKZYRFg/132","watermark":{"timestamp":1562654805,"appid":"wxfc974478cda762b4"}}
        return 0;//OK
    }
}